package com.larry.rabbitmq.springbootrabbitmq.controller;

import com.larry.rabbitmq.springbootrabbitmq.config.DelayedQueueConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;

/**
 * @author larry
 * @Title: larry-rabbitmq
 * @Package com.larry.rabbitmq.springbootrabbitmq.controller
 * @Description: 发送延迟消息
 * http://localhost:8080/ttl/sendMsg/哈哈哈
 * @date 7/4/214:41 PM
 */

@Slf4j
@RestController
@RequestMapping("/ttl")
public class SendMsgController {

    //注入模板
    @Autowired
    private RabbitTemplate rabbitTemplate;


    //发消息
    @RequestMapping("/sendMsg/{message}")
    public void sendMsg(@PathVariable String message){
        log.info("当前时间: {},发送一条信息给两个TTL队列: {}",new Date().toString(),message);

        rabbitTemplate.convertAndSend("X","XA","消息来自TTL为10s的队列: " + message);
        rabbitTemplate.convertAndSend("X","XB","消息来自TTL为40s的队列: " + message);
    }


    //开始发消息 TTL消息

    /**
     * 使用死信队列做延迟的时候,如果使用在消息属性上设置TTL的方式,消息可能并不会按时死亡,因为rabbitmq只会检查第一个消息是否过期
     * 如果过期则丢到私信队列,如果第一个消息的延时时长很长,而第二个消息的延时时长很短,第二个消息并不会优先得到执行
     * @param message
     * @param ttlTime
     */
    @GetMapping("/sendExpirationMsg/{message}/{ttlTime}")
    public void sendMsg(@PathVariable String message,@PathVariable String ttlTime){
        log.info("当前时间: {},发送一条时长 {} 毫秒TTL信息给队列QC: {}",new Date().toString(),ttlTime,message);

        rabbitTemplate.convertAndSend("X","XC",message,msg -> {
            //发送消息的 延迟时长
            msg.getMessageProperties().setExpiration(ttlTime);
            return msg;
        });
    }


    //基于插件的延迟消息
    @GetMapping("/sendDelayMsg/{message}/{delayTime}")
    public void sendMsg(@PathVariable String message,@PathVariable Integer delayTime){
        log.info("当前时间: {},发送一条时长 {} 毫秒信息给延迟队列delayed.queue: {}",new Date().toString(),delayTime,message);

        rabbitTemplate.convertAndSend(DelayedQueueConfig.DELAYED_EXCHANGE_NAME,DelayedQueueConfig.DELAYED_ROUTING_KEY,message, msg -> {
            //发送消息的 延迟时长
            msg.getMessageProperties().setDelay(delayTime);
            return msg;
        });
    }



}
